﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;
using TumbaloSoft.Models;

namespace TumbaloSoft.Controllers
{
    public class ObservacionController : TumbaloController
    {
        private static Object lockObject = new Object();
        //
        // GET: /Observacion/

        public ActionResult RegistrarObservacion()
        {
            //linea de login y permisos
            if (defaultAction != null) return defaultAction;
            try
            {
                //Verificar si es general o de edificios
                int idPerfil = AccountController.getIdPerfil(HttpContext);
                if (idPerfil == 2)
                {
                    int idPersona = AccountController.getIdPersona(HttpContext);
                    AdministradorEdificios administrador = HelperAdministrador.selectByIdPersona(idPersona);
                    int idEdificio = HelperAdministrador.buscaEdificioAdministrado(administrador.prIdAdministrador);
                    Edificio edificio = HelperEdificio.selectById(idEdificio);
                    List<Edificio> listaEdificios = new List<Edificio>();
                    listaEdificios.Add(edificio);
                    ViewBag.listaEdificios = listaEdificios;
                }
                else ViewBag.listaEdificios = HelperEdificio.selectAll();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar registrar la observacion", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

            return View();
        }

        [HttpPost]
        public ActionResult RegistrarObservacion(Observacion observacion)
        {
            //linea de login y permisos
            if (defaultAction != null) return defaultAction;
            Empleado auxEmpleado;
            try
            {
                ViewBag.listaEdificios = HelperEdificio.selectAll();                          
                auxEmpleado = HelperEmpleado.selectById(observacion.prEmpleadoRegistro.prIdEmpleado);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar registrar la observacion", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            //Validar Empleado
            if ( auxEmpleado == null )
            {
                ModelState.AddModelError("prEmpleadoRegistro.prIdEmpleado", "No existe el empleado con el id "+observacion.prEmpleadoRegistro.prIdEmpleado);
            }

            if (ModelState.IsValidField("prDescripcion") && ModelState.IsValidField("prFechaRegistro"))
            {
                //Asigno estado y tipo a  la observacion
                observacion.prEstado = "REGISTRADO";
                observacion.prTipoObservacion = new TipoObservacion();
                observacion.prTipoObservacion.prIdTipoObservacion = 2;
                try
                {
                    lock (lockObject)
                    {
                        observacion.prIdObservacion = HelperObservacion.SiguienteCodigo();
                        HelperObservacion.ObservacionInsertEmpleado(observacion);
                    }
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al intentar registrar la observacion", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }

                ViewBag.mensaje = "Se registro correctamente su Observacion";
                ViewBag.returnURL = "/Observacion/RegistrarObservacion";
                return View("~/Views/Shared/Exito.cshtml");
                    
            }
            return View(observacion);
        }

        public ActionResult ConsultarObservacion(BusquedaObservacion observacionBuscar)
        {

            //linea de login y permisos
            if (defaultAction != null) return defaultAction;
            int numActivos = 0;
            try
            {
                //Verificar si es general o de edificios
                int idPerfil = AccountController.getIdPerfil(HttpContext);
                if (idPerfil == 2)
                {
                    int idPersonaPerfil = AccountController.getIdPersona(HttpContext);
                    AdministradorEdificios administradorPerfil = HelperAdministrador.selectByIdPersona(idPersonaPerfil);
                    int idEdificioPerfil = HelperAdministrador.buscaEdificioAdministrado(administradorPerfil.prIdAdministrador);
                    Edificio edificio = HelperEdificio.selectById(idEdificioPerfil);
                    observacionBuscar.prEdificioRegistro = edificio;   
                    List<Edificio> listaEdificios = new List<Edificio>();
                    listaEdificios.Add(edificio);
                    ViewBag.listaEdificios = listaEdificios;
                }
                else ViewBag.listaEdificios = HelperEdificio.selectAll();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar consultar la observacion", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            //Verifico que el empleado no sea null
            if (observacionBuscar.prEmpleadoRegistro == null)
            {
                observacionBuscar.prEmpleadoRegistro = new Empleado();
                observacionBuscar.prEmpleadoRegistro.prIdEmpleado = 0;
            }
            //Obtengo el edificio
            int idPersona = AccountController.getIdPersona(HttpContext);
            AdministradorEdificios administrador = HelperAdministrador.selectByIdPersona(idPersona);
            int idEdificio = HelperAdministrador.buscaEdificioAdministrado(administrador.prIdAdministrador);
            observacionBuscar.prEdificioRegistro = HelperEdificio.selectById(idEdificio);
            //Verificar que el propietario no sea null
            if (observacionBuscar.prPropietarioRegistro == null)
            {
                observacionBuscar.prPropietarioRegistro = new Propietario();
                observacionBuscar.prPropietarioRegistro.prIdPropietario = 0;
            }

            if (observacionBuscar.prTipoObservacion == null)
            {
                observacionBuscar.prTipoObservacion = new TipoObservacion();
                observacionBuscar.prTipoObservacion.prIdTipoObservacion = 0;
            }

            //Fijo un rango por default de fechas que la base de datos soporte            
            if (observacionBuscar.prFechaMin.Year < 1900) observacionBuscar.prFechaMin = new DateTime(1900, 1, 1);
            if (observacionBuscar.prFechaMax.Year < 1900) observacionBuscar.prFechaMax = new DateTime(2500, 1, 1);

            //Muestro solo activos
            observacionBuscar.prEstado="REGISTRADO";
            try
            {
                IList listaObsLeida = HelperObservacion.buscar(observacionBuscar);
                IList<Observacion> listaObservacion = new List<Observacion>();

                foreach (var observacion in listaObsLeida)
                {
                    Observacion auxObs = (Observacion)observacion;
                    if (auxObs.prPropietarioRegistro.prIdPropietario != 0)
                    {
                        auxObs.prPropietarioRegistro = HelperPropietario.selectById(auxObs.prPropietarioRegistro.prIdPropietario);
                    }
                    else
                    {
                        auxObs.prEmpleadoRegistro = HelperEmpleado.selectById(auxObs.prEmpleadoRegistro.prIdEmpleado);
                    }
                    listaObservacion.Add(auxObs);
                }
                ViewBag.listaObservacion = listaObservacion;
                numActivos = HelperObservacion.selectCountActivos();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar consultar la observacion", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            ViewBag.prevPage = observacionBuscar.prPage - 1;
            ViewBag.nextPage = observacionBuscar.prPage + 1;
            ViewBag.numPages = numActivos / observacionBuscar.prPageSize;
            if ((numActivos % observacionBuscar.prPageSize) > 0) ViewBag.numPages++;
            return View();
        }

        [HttpPost]
        public ActionResult ConusltarObservaciones()
        {
            //linea de login y permisos
            if (defaultAction != null) return defaultAction;
            try
            {
                return View();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar consultar la observacion", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        public ActionResult AtenderObservacion(int? id)
        {
            //linea de login y permisos
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaEdificios = HelperEdificio.selectAll();
                //Si se llamo sin parametro deberia devolver error
                if (!id.HasValue) return HttpNotFound("Error con el parametro enviado.");

                Observacion observacion = HelperObservacion.selectById(id.Value);
                //si el empleado no se encontro se devuelve un error
                if (observacion == null) return HttpNotFound("No existe el empleado requerido");
                return View(observacion);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar atender la observacion", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

            
        }

        [HttpPost]
        public ActionResult AtenderObservacion(Observacion observacion)
        {
            //linea de login y permisos
            if (defaultAction != null) return defaultAction;
            if (observacion != null && observacion.prIdObservacion != 0)
            {
                try
                {
                    observacion.prEstado = "ATENDIDO";
                    HelperObservacion.update(observacion);
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al intentar atender la observacion", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }

                ViewBag.mensaje = "Se atendió la Observacion "+observacion.prIdObservacion;
                ViewBag.returnURL = "/Observacion/ConsultarObservacion";
                return View("~/Views/Shared/Exito.cshtml");

            }

            return View();
        }

    }
}
